﻿using IQReportes.Boundary;
using IQReportes.Utils;
using IQReportes.ViewModels;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Web;

namespace IQReportes.Models.Logica
{
    /// <summary>
    /// lógica para subir archivo
    /// </summary>
    public class LogicaSubirArchivo
    {
        /// <summary>
        /// validar archivo subido
        /// </summary>
        /// <param name="fileParam">archivo subido</param>
        /// <param name="fechaParam">fecha de archivo</param>
        /// <param name="codInstitucion">institución seleccionada</param>
        /// <param name="tipoSubmit">tipo de petición(validar o subir)</param>
        /// <returns>mensaje de éxito o error</returns>
        public ResponseFileUpload validarArchivo(HttpPostedFileBase fileParam, string fechaParam, int codInstitucion, int tipoSubmit)
        {
            //tipoSubmit ==0 validar  == 1 subir
            LogicaCargaCSV logicaCargarCSV = new LogicaCargaCSV();
            LogicaParametro logicaParametro =  new LogicaParametro();
            ResponseFileUpload rfu = new ResponseFileUpload();
            LogicaUsuario logicaUsuario = new LogicaUsuario();
            
            if (fechaParam == null || fechaParam.Length == 0)
            {
                rfu.msg = "Debe seleccionar una fecha";
                return rfu;
            }
            DateTime fechaFormato = DateTime.ParseExact(fechaParam, "dd/MM/yyyy", CultureInfo.InvariantCulture);
            var fileName = Path.GetFileName(fileParam.FileName);
            var path = Path.Combine( logicaParametro.getPath() , fileName);

            if (fileParam.ContentLength > 0)
            {
                
                
                if (tipoSubmit == 0)
                {
                    var repetido =  logicaCargarCSV.existeFechaCSV(fechaParam,codInstitucion);
                    if (repetido)
                    {
                        rfu.repetido = true;
                        rfu.msg = "Ya existe un archivo para la fecha e institución seleccionados.";
                    }
                    else
                    {
                        fileParam.SaveAs(path);
                        
                        ErrorCSV errorCSV = new ErrorCSV();
                        errorCSV = logicaCargarCSV.cargarTransaccionesCsv(logicaParametro.getPath(), fileName, Constantes.CONFIRMACION_KO, fechaFormato,codInstitucion);
                        if (errorCSV.dirErroneos.Count > 0) // errores de dir
                        {
                            rfu.valido = false;
                            rfu.msg = "El archivo tiene DIRs que no se encuentran en la base de datos: " + (new FormatterErrorDir()).format(errorCSV.dirErroneos)+" .";
                        }
                        else
                        {
                            rfu.valido = true;
                            rfu.msg = "Archivo válido";
                        }
                    }
                }
                else //cargar archivo
                {
                    ErrorCSV errorCSV = new ErrorCSV();
                    errorCSV = logicaCargarCSV.cargarTransaccionesCsv(logicaParametro.getPath(), fileName, Constantes.CONFIRMACION_OK, fechaFormato, codInstitucion);
                    rfu.fin = errorCSV.sinError;
                    if (rfu.fin)
                    {
                        rfu.msg = "Archivo cargado exitosamente";
                        logicaParametro.guardarUltimaActualizacion(fechaFormato, logicaUsuario.getIdUsuarioActual());
                    }
                    else
                    {
                        rfu.valido = false;
                        rfu.repetido = true;
                        rfu.msg = "Archivo no contiene DIRS";
                    }
                }
            }
            else
            {
                rfu.msg = "Archivo vacío";
                return rfu;
            }
            return rfu;
        }
    }
}